package com.socialsoftware.Page;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import com.socialsoftware.MediaCommunication.activity.AudioChatActivity;
import com.socialsoftware.MediaCommunication.activity.ScreenSharingActivity;
import com.socialsoftware.MediaCommunication.activity.VideoChatActivity;
import com.socialsoftware.MediaCommunication.model.CallMode;
import com.socialsoftware.MediaCommunication.utils.Constants;
import com.socialsoftware.R;
import com.socialsoftware.model.Contact;
import com.socialsoftware.repository.ContactRepository;
import com.socialsoftware.util.AvatarUtil;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class FriendProfileActivity extends AppCompatActivity {

    private static final String TAG = "FriendProfileActivity";

    private ImageView ivAvatar;
    private TextView tvRemark;
    private TextView tvWechatId;
    private TextView tvNickname;
    private TextView tvRegion;
    private TextView tvMomentsStatus;
    private ImageView ivMomentsPreview;
    private Button btnSetRemark;
    private LinearLayout layoutSendMessage;
    private LinearLayout layoutVoiceCall;
    private LinearLayout layoutVideoCall;
    private LinearLayout layoutScreenShare;
    private LinearLayout layoutFriendInfo;
    private LinearLayout layoutFriendPermissions;

    private Contact contact;
    private SharedPreferences preferences;
    private static final String PREF_NAME = "contact_preferences";
    private static final String PREF_REMARK_PREFIX = "remark_";
    private ContactRepository contactRepository;
    
    // 模拟朋友圈状态
    private static final String[] MOMENTS_STATUS = {
        "最近没有更新",
        "1小时前更新",
        "今天 12:30",
        "昨天 18:45",
        "3天前更新"
    };
    
    // 模拟地区数据
    private static final Map<String, String> REGIONS = new HashMap<String, String>() {{
        put("1", "北京 朝阳");
        put("2", "上海 浦东");
        put("3", "广东 深圳");
        put("4", "江苏 南京");
        put("5", "浙江 杭州");
        put("6", "四川 成都");
        put("7", "湖北 武汉");
        put("8", "陕西 西安");
        put("9", "辽宁 大连");
        put("10", "山东 青岛");
        put("11", "福建 厦门");
        put("12", "河南 郑州");
        put("13", "天津 和平区");
        put("14", "重庆 渝中区");
        put("15", "安徽 合肥");
        put("16", "湖南 长沙");
        put("17", "河北 石家庄");
        put("18", "广西 南宁");
        put("19", "江西 南昌");
        put("20", "美国 纽约");
    }};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_friend_profile);

        preferences = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
        contactRepository = new ContactRepository(getApplication());
        
        // 获取传递的联系人ID
        String contactId = getIntent().getStringExtra("contact_id");
        String username = getIntent().getStringExtra("contact_username");

        if (contactId == null || contactId.isEmpty()) {
            Log.e("FriendProfileActivity", "No contact ID provided");
            Toast.makeText(this, "联系人信息不存在", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

        // 初始化视图
        initViews();
        setupToolbar();
        
        // 从数据库获取联系人信息，不再尝试验证contactId格式
        retrieveContactInfo(username);
    }

    private void initViews() {
        ivAvatar = findViewById(R.id.iv_avatar);
        tvRemark = findViewById(R.id.tv_remark);
        tvWechatId = findViewById(R.id.tv_account_id);
        tvNickname = findViewById(R.id.tv_nickname);
        tvRegion = findViewById(R.id.tv_region);
        tvMomentsStatus = findViewById(R.id.tv_moments_status);
        ivMomentsPreview = findViewById(R.id.iv_moments_preview);
        btnSetRemark = findViewById(R.id.btn_set_remark);
        layoutSendMessage = findViewById(R.id.layout_send_message);
        layoutVoiceCall = findViewById(R.id.layout_voice_call);
        layoutVideoCall = findViewById(R.id.layout_video_call);
        layoutScreenShare = findViewById(R.id.layout_screen_share);
        layoutFriendInfo = findViewById(R.id.layout_friend_info);
        layoutFriendPermissions = findViewById(R.id.layout_friend_permissions);
    }

    private void setupToolbar() {
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setTitle("");
        }
    }

    @SuppressLint("SetTextI18n")
    private void displayContactInfo() {
        // 安全检查，确保contact不为null
        if (contact == null) {
            Log.e("FriendProfileActivity", "Contact is null in displayContactInfo");
            Toast.makeText(this, "联系人信息不存在", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

        // 设置头像
        if (contact.getAvatar() != null && !contact.getAvatar().isEmpty()) {
            // 在实际应用中，这里应该使用图片加载库如Glide或Picasso加载网络或本地图片
            // Glide.with(this).load(contact.getAvatar()).circleCrop().into(ivAvatar);
            
            // 由于这是示例，我们使用渐变背景的头像，更美观专业
            ivAvatar.setImageDrawable(AvatarUtil.getGradientAvatar(this, contact.getName()));
        } else {
            ivAvatar.setImageDrawable(AvatarUtil.getGradientAvatar(this, contact.getName()));
        }

        // 设置文本信息
        String savedRemark = getSavedRemark(contact.getId());
        
        // 决定显示的名称顺序：自定义备注 > 服务器备注 > 显示名称
        String displayName;
        if (!TextUtils.isEmpty(savedRemark)) {
            displayName = savedRemark;
        } else if (!TextUtils.isEmpty(contact.getRemark())) {
            displayName = contact.getRemark();
        } else {
            displayName = contact.getName();
        }
        System.out.println(contact+"通讯录");
        // 记录详细信息用于调试
        Log.d("FriendProfileActivity", "联系人信息: ID=" + contact.getId() + 
              ", 名称=" + contact.getName() + 
              ", 备注=" + contact.getRemark() + 
              ", 显示名称=" + displayName);
        
        // 设置UI元素
        tvRemark.setText(displayName);
        
        // 账号显示：如果备注存在且不同于名称，则显示用户名作为账号
        // 否则直接使用ID作为账号
        String accountDisplay;
        System.out.println(contact);
        if (contact.getRemark() != null && !contact.getRemark().equals(contact.getName())) {
            accountDisplay = contact.getName();
        } else {
            accountDisplay = "wxid_" + generateWechatId(contact.getId());
        }
        tvWechatId.setText("账号: " + accountDisplay);
        
        // 昵称显示：总是显示主要名称
        tvNickname.setText("昵称: " + contact.getRemark());
        
        // 显示地区
        tvRegion.setText("地区: " + (contact.getRegion() != null ? contact.getRegion() : "未知"));
        
        // 设置朋友圈状态 - 使用hashCode而不是Long.parseLong来生成随机种子
        Random random = new Random(contact.getId().hashCode());
        int statusIndex = random.nextInt(MOMENTS_STATUS.length);
        tvMomentsStatus.setText(MOMENTS_STATUS[statusIndex]);
        
        // 设置朋友圈预览图 (在实际应用中应该加载真实图片)
        // 使用渐变背景的预览图，更专业美观
        ivMomentsPreview.setImageDrawable(AvatarUtil.getGradientAvatar(
                this, 
                "Moments" + contact.getId() // 生成不同的渐变效果
        ));
    }

    private void setupClickListeners() {
        // 设置备注按钮
        btnSetRemark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showSetRemarkDialog();
            }
        });
        
        // 发消息
        layoutSendMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FriendProfileActivity.this, ChatDetailActivity.class);
                intent.putExtra("chat_id", contact.getId());
                intent.putExtra("chat_name", contact.getName());
                intent.putExtra("chat_username", contact.getName());
                startActivity(intent);
            }
        });

        // 语音通话
        layoutVoiceCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FriendProfileActivity.this, AudioChatActivity.class);
                intent.putExtra("contact_username", contact.getName());
                intent.putExtra("contact_name", contact.getName());
                intent.putExtra(Constants.EXTRA_CALL_MODE, CallMode.AUDIO.getValue());
                Log.d(TAG, "发起语音通话给: " + contact.getName());
                startActivity(intent);
            }
        });

        // 视频通话
        layoutVideoCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FriendProfileActivity.this, VideoChatActivity.class);
                intent.putExtra("contact_username", contact.getName());
                intent.putExtra("contact_name", contact.getName());
                intent.putExtra(Constants.EXTRA_CALL_MODE, CallMode.VIDEO.getValue());
                Log.d(TAG, "发起视频通话给: " + contact.getName());
                startActivity(intent);
            }
        });

        // 屏幕共享
        layoutScreenShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FriendProfileActivity.this, ScreenSharingActivity.class);
                intent.putExtra("contact_username", contact.getName());
                intent.putExtra("contact_name", contact.getName());
                intent.putExtra(Constants.EXTRA_CALL_MODE, CallMode.SCREEN.getValue());
                Log.d(TAG, "发起屏幕共享给: " + contact.getName());
                startActivity(intent);
            }
        });

        // 朋友资料
        layoutFriendInfo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FriendProfileActivity.this, "查看" + tvRemark.getText() + "的详细资料", Toast.LENGTH_SHORT).show();
                // 在实际应用中，这里应该打开朋友资料页面
            }
        });

        // 朋友权限
        layoutFriendPermissions.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FriendProfileActivity.this, "设置" + tvRemark.getText() + "的朋友权限", Toast.LENGTH_SHORT).show();
                // 在实际应用中，这里应该打开朋友权限设置页面
            }
        });
    }
    
    /**
     * 显示设置备注对话框
     */
    private void showSetRemarkDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        View view = getLayoutInflater().inflate(R.layout.dialog_set_remark, null);
        final EditText editRemark = view.findViewById(R.id.edit_remark);
        
        // 设置当前备注
        String currentRemark = tvRemark.getText().toString();
        editRemark.setText(currentRemark);
        editRemark.setSelection(currentRemark.length());
        
        builder.setView(view);
        builder.setTitle("设置备注");
        builder.setPositiveButton("确定", (dialog, which) -> {
            String newRemark = editRemark.getText().toString().trim();
            if (!TextUtils.isEmpty(newRemark)) {
                tvRemark.setText(newRemark);
                saveRemark(contact.getId(), newRemark);
                Toast.makeText(FriendProfileActivity.this, "备注已更新", Toast.LENGTH_SHORT).show();
            }
        });
        builder.setNegativeButton("取消", null);
        builder.show();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
    }
    
    /**
     * 从数据库获取联系人信息
     * @param contactIdOrUsername 联系人ID或用户名
     */
    private void retrieveContactInfo(String contactIdOrUsername) {
        // 显示加载中
        findViewById(R.id.progress_bar).setVisibility(View.VISIBLE);
        
        // 首先尝试通过用户名获取联系人
        contactRepository.getContactByName(contactIdOrUsername).observe(this, retrievedContact -> {
            if (retrievedContact != null) {
                // 如果通过用户名找到了联系人
                findViewById(R.id.progress_bar).setVisibility(View.GONE);
                contact = retrievedContact;
                Log.d("FriendProfileActivity", "通过用户名找到联系人: " + contactIdOrUsername);
                displayContactInfo();
                setupClickListeners();
            } else {
                // 如果通过用户名没找到，尝试通过ID查找
                contactRepository.getContactById(contactIdOrUsername).observe(this, contactById -> {
                    findViewById(R.id.progress_bar).setVisibility(View.GONE);
                    
                    if (contactById != null) {
                        // 如果通过ID找到了联系人
                        contact = contactById;
                        Log.d("FriendProfileActivity", "通过ID找到联系人: " + contactIdOrUsername);
                        displayContactInfo();
                        setupClickListeners();
                    } else {
                        // 如果联系人不存在，尝试创建一个临时联系人
//                        Log.w("FriendProfileActivity", "Contact not found in database, creating fallback contact");
                        Log.d("FriendProfileActivity日志：",contact.toString());
                        contact = createFallbackContact(contactIdOrUsername);
                        
                        if (contact != null) {
                            displayContactInfo();
                            setupClickListeners();
                        } else {
                            // 如果仍然无法创建联系人，显示错误信息并返回
                            Toast.makeText(FriendProfileActivity.this, "找不到联系人信息", Toast.LENGTH_SHORT).show();
                            finish();
                        }
                    }
                });
            }
        });
    }
    
    /**
     * 创建临时联系人对象，用于处理数据库中找不到联系人的情况
     */
    private Contact createFallbackContact(String contactIdOrUsername) {
        try {
            // 尝试从Intent获取更多信息
            String contactName = getIntent().getStringExtra("contact_name");
            String username = getIntent().getStringExtra("contact_username");
            
            // 如果有用户名，优先使用用户名
            if (!TextUtils.isEmpty(username)) {
                contactName = username;
            }
            
            // 如果仍然没有名称，使用传入的参数
            if (TextUtils.isEmpty(contactName)) {
                contactName = contactIdOrUsername;
            }
            
            // 创建一个新的联系人对象
            Contact fallbackContact = new Contact(contactIdOrUsername, contactName, "avatar_default");
            fallbackContact.setRegion("未知地区");
            
            // 如果传入的是用户名，设置备注为联系人ID
            if (!TextUtils.isEmpty(username) && !username.equals(contactIdOrUsername)) {
                fallbackContact.setRemark(contactIdOrUsername);
            }
            
            Log.d("FriendProfileActivity", "创建临时联系人: ID=" + contactIdOrUsername + ", 名称=" + contactName);
            return fallbackContact;
        } catch (Exception e) {
            Log.e("FriendProfileActivity", "Failed to create fallback contact", e);
            return null;
        }
    }
    
    /**
     * 生成微信ID
     */
    private String generateWechatId(String contactId) {
        // 安全检查
        if (contact == null || contact.getName() == null) {
            return "user_" + contactId;
        }
        
        // 生成一个看起来像微信ID的字符串
        StringBuilder sb = new StringBuilder();
        sb.append(contact.getName().toLowerCase().replaceAll("\\s+", ""));
        
        // 添加一些随机数字 - 使用hashCode而不是Long.parseLong来生成随机种子
        Random random = new Random(contactId.hashCode());
        int randomNum = 10000 + random.nextInt(90000);
        sb.append(randomNum);
        
        return sb.toString();
    }
    
    /**
     * 获取保存的备注
     */
    private String getSavedRemark(String contactId) {
        return preferences.getString(PREF_REMARK_PREFIX + contactId, "");
    }
    
    /**
     * 保存备注
     */
    private void saveRemark(String contactId, String remark) {
        preferences.edit().putString(PREF_REMARK_PREFIX + contactId, remark).apply();
    }
    
    /**
     * 生成随机颜色
     */
    private int getRandomColor(Random random) {
        int[] colors = {
            0xFF5722, // 深橙色
            0xFF9800, // 橙色
            0xFFC107, // 琥珀色
            0x8BC34A, // 浅绿色
            0x009688, // 茶色
            0x03A9F4, // 浅蓝色
            0x3F51B5, // 靛蓝色
            0x673AB7, // 深紫色
            0x9C27B0, // 紫色
            0xE91E63  // 粉色
        };
        
        return colors[random.nextInt(colors.length)] | 0xFF000000; // 添加不透明度
    }
} 